package otc.regate.serveur.controleur;

import java.io.ObjectInputStream;
import java.net.Socket;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;

import otc.regate.serveur.modele.Coordonnees;
import otc.regate.serveur.modele.Course;
import otc.regate.serveur.modele.Participant;
/**
 * Classe recuperant le flux XML envoye par les clients.
 *
 * @author Escop, Jacquet, Loiret, Marboeuf, Millet, Montferrand
 *
 */
public class ThreadServeur extends Thread {

    /** Socket du serveur. */
    private Socket socketServeur;
    /** Fichier GPX cree a partir du flux XML recu. */
    private java.io.File fichierGPX;
    /** Permet de parser le fichier XML. */
    private Parser parser;
    /** Permet la lecture du fichier XML. */
    private XMLReader xmlReader;
    /** Instance de la course. */
    private Course course;
    /** Instance du participant courant. */
    private Participant participantCourant;

    /**
     * Constructeur.
     *
     * @param socketServeur socket
     * @param c course
     */
    public ThreadServeur(final Socket socketServeur, final Course c) {

        this.socketServeur = socketServeur;
        try {
            this.course = c;

            fichierGPX = new java.io.File("fichierGPX.xml");
            fichierGPX.createNewFile();

            // Creation du parser pour l'analyse des formats GPX
            parser = new Parser();
            xmlReader = XMLReaderFactory.createXMLReader();
            xmlReader.setContentHandler(parser);
            xmlReader.setErrorHandler(parser);

        } catch (Exception e) {
        }
    }

    /**
     * Methode executee par le thread.
     *
     */
    public final void run() {

        try {

            while (true) {

                java.io.FileOutputStream fluxGPX = new java.io.FileOutputStream(
                        fichierGPX);
                fichierGPX.createNewFile();
                ObjectInputStream inputStream = new ObjectInputStream(
                        socketServeur.getInputStream());
                String contenuXML = ((String) inputStream.readObject());
                fluxGPX.write(contenuXML.getBytes());
                fluxGPX.close();

                xmlReader.parse("fichierGPX.xml");

                participantCourant = course.getParticipant(parser
                        .getIdSkipper());
                participantCourant.setConnexion(true);

                SimpleDateFormat formatter = new SimpleDateFormat(
                        "yyyy-MM-dd HH:mm:ss");
                ParsePosition pos = new ParsePosition(0);
                Date date = formatter.parse(parser.getDate(), pos);
                participantCourant.ajoutTransmission(date, new Coordonnees(
                        parser.getLatitude(), parser.getLongitude()));

            }

        } catch (Exception e) {
        }
    }
}